package edu.ucsd.db.bassarisk.algebra.logical.visitor;

import edu.ucsd.db.bassarisk.algebra.logical.AggregateAll;
import edu.ucsd.db.bassarisk.algebra.logical.AggregateWithin;
import edu.ucsd.db.bassarisk.algebra.logical.ConstantTuple;
import edu.ucsd.db.bassarisk.algebra.logical.Intersection;
import edu.ucsd.db.bassarisk.algebra.logical.Join;
import edu.ucsd.db.bassarisk.algebra.logical.JoinWithin;
import edu.ucsd.db.bassarisk.algebra.logical.Map;
import edu.ucsd.db.bassarisk.algebra.logical.Scan;
import edu.ucsd.db.bassarisk.algebra.logical.Select;
import edu.ucsd.db.bassarisk.algebra.logical.Union;
import edu.ucsd.db.bassarisk.algebra.logical.WithinContext;

public interface LogicalOperatorVisitor<R, A> {
  R visitAggregateAll(AggregateAll op, A arg);

  R visitAggregateWithin(AggregateWithin op, A arg);

  R visitConstantTuple(ConstantTuple op, A arg);

  R visitIntersection(Intersection op, A arg);

  R visitJoin(Join op, A arg);

  R visitJoinWithin(JoinWithin op, A arg);

  R visitMap(Map op, A arg);
  
  R visitSelect(Select op, A arg);

  R visitScan(Scan op, A arg);

  R visitUnion(Union op, A arg);

  R visitWithinContext(WithinContext op, A arg);
}
